<?php

class Repuesto_X_Cotizacion_Model extends CI_Model {
    const STR_NOMBRE_TABLA = 'cotizacion_repuesto_solicitud';
    const STR_NOMBRE_TABLA_REPUESTO_SOLICITUD = 'repuesto_solicitud';
    const STR_NOMBRE_TABLA_COTIZACION = 'cotizacion';
    const STR_NOMBRE_TABLA_REPUESTO = 'repuesto';
    const STR_NOMBRE_TABLA_USUARIO = 'usuario';
    const STR_NOMBRE_TABLA_PERSONA = 'persona';
    const STR_NOMBRE_TABLA_PERSONA_JURIDICA = 'persona_juridica';
    const STR_NOMBRE_TABLA_MAESTRA = 'tabla_maestra';
    
    function __construct() {
        parent::__construct();
    }

    /**
     * Obtener el detalle de los repuestoas asociados a una cotizacion.
     * @author Fernando Esteban Valerio
     * @param int $idCotizacion Id cotizacion
     * @param int $opcion Opcion
     * @param int $orden Orden de ordenamiento
     * @param int $ordPrecio Orden de precio
     * @param int $ordStock Orden de stock
     * @return array
     */
    public function getListRepuestoXCotizacion($idCotizacion, $opcion=0, $orden=0, $ordPrecio=-1, $ordStock=-1) {
        $this->db->select("
            cotizacion_repuesto_solicitud.id_cotizacion_repuesto_solicitud AS id,
            cotizacion_repuesto_solicitud.id_cotizacion AS id_cotizacion,
            cotizacion_repuesto_solicitud.id_repuesto AS id_repuesto,
            cotizacion_repuesto_solicitud.id_solicitud AS id_solicitud,
            repuesto.id_repuesto AS id_repuesto,
            repuesto.nombre AS nombre_repuesto,
            repuesto_solicitud.numero_parte AS numero_parte,
            repuesto_solicitud.tipo AS tipo,
            repuesto_solicitud.descripcion AS descripcion,
            repuesto_solicitud.cantidad AS cantidad,
            repuesto_solicitud.foto_repuesto AS foto_repuesto,
            repuesto_solicitud.id_estado AS id_estado,
            cotizacion_repuesto_solicitud.precio AS monto,
            (cotizacion_repuesto_solicitud.precio * repuesto_solicitud.cantidad) AS total,
            cotizacion_repuesto_solicitud.disponibilidad AS disponibilidad,
            cotizacion_repuesto_solicitud.fecha_entrega AS fecha_entrega");            
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_REPUESTO, "repuesto.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto");
        $this->db->join(self::STR_NOMBRE_TABLA_REPUESTO_SOLICITUD, "repuesto_solicitud.id_solicitud = cotizacion_repuesto_solicitud.id_solicitud AND repuesto_solicitud.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto");
        if ($idCotizacion != '' && $idCotizacion > 0) {
            $this->db->where('cotizacion_repuesto_solicitud.id_cotizacion', $idCotizacion);
        }
        if ($opcion == '1') {
            $this->db->where('cotizacion_repuesto_solicitud.precio >', 0);
        }
        if ($orden != '0') {
            if ($orden == '1') {
                $this->db->order_by("cotizacion_repuesto_solicitud.precio", "ASC");
            }
            if ($orden == '2') {
                $this->db->order_by("cotizacion_repuesto_solicitud.precio", "DESC");
            }
            if ($orden == '3') {
                $this->db->order_by("cotizacion_repuesto_solicitud.disponibilidad", "ASC");
            }
            if ($orden == '4') {
                $this->db->order_by("cotizacion_repuesto_solicitud.disponibilidad", "DESC");
            }            
        }
        if ($ordPrecio != '' && $ordPrecio != '-1') {
            if ($ordPrecio == '0') {
                $this->db->order_by("cotizacion_repuesto_solicitud.precio", "ASC");
            }
            if ($ordPrecio == '1') {
                $this->db->order_by("cotizacion_repuesto_solicitud.precio", "DESC");
            }
        }
        if ($ordStock != '' && $ordStock != '-1') {
            if ($ordStock == '0') {
                $this->db->order_by("cotizacion_repuesto_solicitud.disponibilidad", "ASC");
            }
            if ($ordStock == '1') {
                $this->db->order_by("cotizacion_repuesto_solicitud.disponibilidad", "DESC");
            } 
        }
        $this->db->distinct();
        $query = $this->db->get();
        return $query->result();
    }
    
    /**
     * Obtener el monto total de un repuesto determinado.
     * @author Fernando Esteban Valerio
     * @param int $idRepuestoXCotizacion
     * @return array
     */
    public function getMontoTotal($idRepuestoXCotizacion) {
        $query = "SELECT SUM(precio*cantidad) AS total FROM " . self::STR_NOMBRE_TABLA . " WHERE id_cotizacion_repuesto_solicitud IN (" . $idRepuestoXCotizacion . ")";
        $query = $this->db->query($query);
    	return $query->result();        
    }
    
    /**
     * Obtener el monto total de los repuestos cotizados de una solicitud asociada a un proveedor.
     * @author Fernando Esteban Valerio
     * @param int $idSolicitud Id solicitud
     * @param int $idProveedor Id proveedor
     * @return array
     */
    public function getMontoTotalXProveedor($idSolicitud, $idProveedor) {
        $query = "SELECT SUM(cotizacion_repuesto_solicitud.precio * cotizacion_repuesto_solicitud.cantidad) AS total "
               . "FROM " . self::STR_NOMBRE_TABLA_COTIZACION . ", " . self::STR_NOMBRE_TABLA . " WHERE "
               . "cotizacion.id_solicitud = '" . $idSolicitud . "' AND "
               . "cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND "
               . "cotizacion_repuesto_solicitud.precio > 0 AND "
               . "cotizacion.id_usuario = '" . $idProveedor . "'";
        $query = $this->db->query($query);
    	return $query->result();
    }
    
    /**
     * Obtener la informacion del monto y disponibilidad para un repuesto de una determinada cotizacion.
     * @author Fernando Esteban Valerio
     * @param int $idCotizacion
     * @param int $idRepuesto
     * @return array
     */
    public function getRepuestoXCotizacion($idCotizacion, $idRepuesto) {
        $query = "SELECT id_cotizacion_repuesto_solicitud,precio,disponibilidad FROM " . self::STR_NOMBRE_TABLA . " WHERE id_cotizacion IN (" . $idCotizacion . ") AND "
               . "id_repuesto = " . $idRepuesto . " AND precio IS NOT NULL";
        $query = $this->db->query($query);
    	return $query->result();        
    }
    
    /**
     * Marcar el repuesto como cotizado por el cliente.
     * @author Fernando Esteban Valerio
     * @param array $data Arreglo con la informacion de los repuestos seleccionados por el cliente
     */
    public function updateRepuestoXCliente($data) {
        $this->db->set('seleccionado', $data['seleccionado']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);        
        $this->db->where('id_cotizacion_repuesto_solicitud', $data['id_cotizacion_repuesto_solicitud']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Obtener los proveedores a los cuales se va realizar el pago respectivo.
     * @param int $lstIdRepuestoXCotizacion
     * @return array
     */
    public function getProveedoresAPagar($lstIdRepuestoXCotizacion) {
        $query = "SELECT cotizacion.id_proveedor AS idProveedor "
               . "FROM " . self::STR_NOMBRE_TABLA_COTIZACION . "," . self::STR_NOMBRE_TABLA . " WHERE "
               . "cotizacion.id_cotizacion = repuesto_x_cotizacion.id_cotizacion AND "
               . "repuesto_x_cotizacion.id_repuesto_x_cotizacion IN (" . $lstIdRepuestoXCotizacion . ") GROUP BY cotizacion.id_proveedor";
        $query = $this->db->query($query);
    	return $query->result();
    }
            
    /**
     * Obtener los repuestos cotizados por el cliente para realizar el pago
     * respectivo a cada proveedor asociado a esos repuestos.
     * @param int $idSolicitud
     * @param int $idProveedor
     * @return array
     */
    public function getRepuestosAPagarXProveedor($idSolicitud, $idProveedor) {
        $query = "SELECT cotizacion_repuesto_solicitud.precio,cotizacion_repuesto_solicitud.disponibilidad,"
               . "cotizacion_repuesto_solicitud.fecha_entrega,repuesto_solicitud.*,cotizacion.id_usuario AS id_proveedor "
               . "FROM " . self::STR_NOMBRE_TABLA_COTIZACION . "," . self::STR_NOMBRE_TABLA . "," . self::STR_NOMBRE_TABLA_REPUESTO_SOLICITUD . " WHERE "
               . "cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion AND "
               . "cotizacion_repuesto_solicitud.id_repuesto = repuesto_solicitud.id_repuesto AND "
               . "cotizacion.id_usuario = '" . $idProveedor . "' AND cotizacion.id_solicitud = '" . $idSolicitud . "' AND "
               . "cotizacion.id_solicitud = repuesto_solicitud.id_solicitud AND "
               . "cotizacion_repuesto_solicitud.seleccionado = 1 "
               . "ORDER BY cotizacion.id_usuario ASC, cotizacion_repuesto_solicitud.id_repuesto ASC";
        $query = $this->db->query($query);
     	return $query->result();
    }
    
    public function getListRepuestoXSeguimiento($idSolicitud, $idEstado=0, $idProveedor=0) {
        $this->db->select("
            persona_juridica.razon_social AS proveedor,repuesto.id_repuesto AS id_repuesto,repuesto.nombre AS repuesto,
            repuesto_solicitud.tipo AS tipo,repuesto_solicitud.cantidad AS cantidad,repuesto_solicitud.numero_parte AS numero_parte,
            cotizacion_repuesto_solicitud.disponibilidad AS disponibilidad,tabla_maestra.valor_1 AS estado,tabla_maestra.id_tabla_maestra AS id_estado,
            repuesto_solicitud.descripcion AS descripcion,repuesto_solicitud.comentario AS comentario,
            cotizacion_repuesto_solicitud.fecha_entrega AS fecha");
        $this->db->from(self::STR_NOMBRE_TABLA);
        $this->db->join(self::STR_NOMBRE_TABLA_COTIZACION, "cotizacion.id_cotizacion = cotizacion_repuesto_solicitud.id_cotizacion");
        $this->db->join(self::STR_NOMBRE_TABLA_REPUESTO, "repuesto.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto");        
        $this->db->join(self::STR_NOMBRE_TABLA_REPUESTO_SOLICITUD, "repuesto_solicitud.id_repuesto = cotizacion_repuesto_solicitud.id_repuesto AND repuesto_solicitud.id_solicitud = cotizacion_repuesto_solicitud.id_solicitud");
        $this->db->join(self::STR_NOMBRE_TABLA_USUARIO, "usuario.id_usuario = cotizacion.id_usuario");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA, "persona.id_persona = usuario.id_persona");
        $this->db->join(self::STR_NOMBRE_TABLA_PERSONA_JURIDICA, "persona_juridica.id_persona = persona.id_persona");
        $this->db->join(self::STR_NOMBRE_TABLA_MAESTRA, "tabla_maestra.id_tabla_maestra = repuesto_solicitud.id_estado");
        $this->db->where('cotizacion.id_solicitud', $idSolicitud);
        if ($idEstado != '' && $idEstado > 0) {
            $this->db->where('cotizacion.id_estado', $idEstado);
        }
        $this->db->where('cotizacion_repuesto_solicitud.seleccionado', INT_SELECCIONADO);
        if ($idProveedor) {
            $this->db->where('cotizacion.id_usuario', $idProveedor);
        }
        $query = $this->db->get();
        return $query->result();
    }
    
    function getRowCount() {
        return $this->db->count_all(self::STR_NOMBRE_TABLA);
    }

    /**
     * Registrar la informacion de una cotizacion.
     * @author Fernando Esteban Valerio
     * @param array $data
     */
    public function insert($data) {
        $this->db->set('id_cotizacion', $data['id_cotizacion']);
        $this->db->set('id_repuesto', $data['id_repuesto']);
        $this->db->set('id_solicitud', $data['id_solicitud']);
    	$this->db->set('cantidad', $data['cantidad']);
        $this->db->set('usuario_registro', $data['usuario_registro']);
        $this->db->set('fecha_registro', $data['fecha_registro']);
        $this->db->insert(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Actualizar el estado de una repuesto asociado a una cotizacion.
     * @author Fernando Esteban Valerio
     * @param array $data
     */
    public function updateEstado($data) {
        $this->db->set('id_estado', $data['id_estado']);
        $this->db->set('comentario', $data['comentario']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);        
        $this->db->where('id_repuesto_x_cotizacion', $data['id_repuesto_x_cotizacion']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Registrar la cotización de los repuestos realizada por el proveedor (Opción Cotizar).
     * @author Fernando Esteban Valerio
     * @param array $data
     */
    public function cotizar($data) {
        $this->db->set('precio', $data['monto']);
        $this->db->set('disponibilidad', $data['disponibilidad']);
        $this->db->set('fecha_entrega', $data['fecha_entrega']);
        $this->db->set('total', $data['total']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);        
        $this->db->where('id_repuesto', $data['id_repuesto']);
        $this->db->where('id_solicitud', $data['id_solicitud']);
        $this->db->where('id_cotizacion', $data['id_cotizacion']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Deshacer selección de repuestos cotizados por el cliente.
     * @author Fernando Esteban Valerio
     * @param array $data
     */
    public function deshacerSeleccion($data) {
        $this->db->set('seleccionado', $data['seleccionado']);
        $this->db->set('usuario_modificacion', $data['usuario_modificacion']);
        $this->db->set('fecha_modificacion', $data['fecha_modificacion']);
        $this->db->where('id_solicitud', $data['id_solicitud']);
        $this->db->update(self::STR_NOMBRE_TABLA);
    }
    
    /**
     * Obtener las cotizaciones seleccionadas para una solicitud determinada.
     * @param int $idSolicitud Id Solicitud
     * @return array
     */
    public function getCotizacionSeleccionadas($idSolicitud) {
        $query = "SELECT id_cotizacion FROM cotizacion_repuesto_solicitud "
               . "WHERE id_solicitud = '" . $idSolicitud . "' AND seleccionado = 1 GROUP BY id_cotizacion";               
        $query = $this->db->query($query);
     	return $query->result();
    }
    
    /**
     * Obtener las cotizaciones no seleccionadas para una solicitud determinada.
     * @param int $idSolicitud Id Solicitud
     * @return array
     */
    public function getCotizacionNoSeleccionadas($idSolicitud) {
        $query = "SELECT id_cotizacion,COUNT(*) AS total FROM cotizacion_repuesto_solicitud "
               . "WHERE id_solicitud = '" . $idSolicitud . "' AND seleccionado = 0 GROUP BY id_cotizacion";
        $query = $this->db->query($query);
     	return $query->result();
    }
}
